--List
--[[
	HTList：自定义List容器
	API:
		New
		Count
		ItemType
		IndexOf
		LastIndexOf
		Contains
		Find
		ForEach
		Add
		Insert
		RemoveAt
		Remove
		Clear
		Sort
--]]

List = {}
List.__index = List

--构造，传入元素类型
List.New = function(self,itemType)
	m = {}
	m.itemType = itemType
	setmetatable(m,List)
	return m
end
--获取元素个数
List.Count = function(self)
	return table.getn(self)
end
--获取元素类型
List.ItemType = function()
	return m.itemType
end
--正向搜索指定元素在容器中的索引（返回第一个，不存在则返回 0）
List.IndexOf  = function(self,item)
	local count = self:Count()
	for i = 1,count do
		if self[i] == item then
			return i
		end
	end
	return 0
end
--反向搜索指定元素在容器中的索引（返回第一个，不存在则返回 0）
List.LastIndexOf = function(self,item)
	local count = self:Count()
	for i = count,1,-1 do
		if self[i] == item then
			return i
		end
	end
	return 0
end
--是否包含指定元素
List.Contains = function(self,item)
	local count = self:Count()
	for i = 1,count do
		if self[i] == item then
			return true
		end
	end
	return false
end
--搜索满足条件的元素（predicate 为条件 Func）
List.Find = function(self,predicate)
	if not predicate or type(predicate)~= 'function' then
		print('Error: Find predicate invalid.')
	end
	local count = self:Count()
	for i = 1,count do
		if predicate(self[i]) then
			return self[i]
		end
	end
	return nil
end
--遍历Foreach
List.ForEach = function(self,action)
	if not action or type(action)~= 'function' then
		print('Error: ForEach action invalid.')
	end
	local count = self:Count()
	for i = 1,count do
		action(self[i])
	end
end
--添加元素
List.Add = function(self,item)
	table.insert(self,item)
end
--添加元素到指定索引
List.Insert = function(self,index,item)
	table.insert(self,index,item)
end
--移除指定索引元素
List.RemoveAt = function(self,index)
	table.remove(self,index)
end
--移除指定元素（若容器中包含多个，则全部移除）
List.Remove = function(self,item)
	local index = self:LastIndexOf(item) --只能反向移除，否则出问题
	if index > 0 then
		table.remove(self,index)
		self:Remove(item) --递归
	end
end
--清空列表
List.Clear = function(self)
	local count = self:Count()
	for i = count,1,-1 do
		table.remove(self,i)
	end
end
--排序
List.Sort = function(self,comparsion)
	if not comparsion or type(comparsion)~= 'function' then
		print('Error: Sort comparsion invalid.')
	end
	if comparsion then
		table.sort(self,comparsion)
	else
		table.sort(self)
	end
end

return List
